
#region license
/// Copyright (c) 2007 Rodrigo B. de Oliveira, Jb Evain and the
/// individuals listed on the ChangeLog entries.
/// 
/// Permission is hereby granted, free of charge, to any person obtaining
/// a copy of this software and associated documentation files (the
/// "Software"), to deal in the Software without restriction, including
/// without limitation the rights to use, copy, modify, merge, publish,
/// distribute, sublicense, and/or sell copies of the Software, and to
/// permit persons to whom the Software is furnished to do so, subject to
/// the following conditions:
/// 
/// The above copyright notice and this permission notice shall be
/// included in all copies or substantial portions of the Software.
/// 
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
/// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
/// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
/// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
/// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
/// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
/// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#endregion
//
// DO NOT EDIT THIS FILE!
//
// This file was generated automatically by astgen.boo.
//


namespace Milo.Ast
{
	using System;
	
	public partial class DepthFirstVisitor : IAstVisitor
	{

		public virtual void OnCompileUnit(Milo.Ast.CompileUnit node)
		{				
			if (EnterCompileUnit(node))
			{
				Visit(node.Modules);
				LeaveCompileUnit(node);
			}
		}
			
		public virtual bool EnterCompileUnit(Milo.Ast.CompileUnit node)
		{
			return true;
		}
		
		public virtual void LeaveCompileUnit(Milo.Ast.CompileUnit node)
		{
		}

		public virtual void OnExplicitMemberInfo(Milo.Ast.ExplicitMemberInfo node)
		{				
			if (EnterExplicitMemberInfo(node))
			{
				Visit(node.InterfaceType);
				LeaveExplicitMemberInfo(node);
			}
		}
			
		public virtual bool EnterExplicitMemberInfo(Milo.Ast.ExplicitMemberInfo node)
		{
			return true;
		}
		
		public virtual void LeaveExplicitMemberInfo(Milo.Ast.ExplicitMemberInfo node)
		{
		}

		public virtual void OnSimpleTypeReference(Milo.Ast.SimpleTypeReference node)
		{
		}

		public virtual void OnArrayTypeReference(Milo.Ast.ArrayTypeReference node)
		{				
			if (EnterArrayTypeReference(node))
			{
				Visit(node.ElementType);
				Visit(node.Rank);
				LeaveArrayTypeReference(node);
			}
		}
			
		public virtual bool EnterArrayTypeReference(Milo.Ast.ArrayTypeReference node)
		{
			return true;
		}
		
		public virtual void LeaveArrayTypeReference(Milo.Ast.ArrayTypeReference node)
		{
		}

		public virtual void OnCallableTypeReference(Milo.Ast.CallableTypeReference node)
		{				
			if (EnterCallableTypeReference(node))
			{
				Visit(node.Parameters);
				Visit(node.ReturnType);
				LeaveCallableTypeReference(node);
			}
		}
			
		public virtual bool EnterCallableTypeReference(Milo.Ast.CallableTypeReference node)
		{
			return true;
		}
		
		public virtual void LeaveCallableTypeReference(Milo.Ast.CallableTypeReference node)
		{
		}

		public virtual void OnGenericTypeReference(Milo.Ast.GenericTypeReference node)
		{				
			if (EnterGenericTypeReference(node))
			{
				Visit(node.GenericArguments);
				LeaveGenericTypeReference(node);
			}
		}
			
		public virtual bool EnterGenericTypeReference(Milo.Ast.GenericTypeReference node)
		{
			return true;
		}
		
		public virtual void LeaveGenericTypeReference(Milo.Ast.GenericTypeReference node)
		{
		}

		public virtual void OnGenericTypeDefinitionReference(Milo.Ast.GenericTypeDefinitionReference node)
		{
		}

		public virtual void OnCallableDefinition(Milo.Ast.CallableDefinition node)
		{				
			if (EnterCallableDefinition(node))
			{
				Visit(node.Attributes);
				Visit(node.Parameters);
				Visit(node.GenericParameters);
				Visit(node.ReturnType);
				Visit(node.ReturnTypeAttributes);
				LeaveCallableDefinition(node);
			}
		}
			
		public virtual bool EnterCallableDefinition(Milo.Ast.CallableDefinition node)
		{
			return true;
		}
		
		public virtual void LeaveCallableDefinition(Milo.Ast.CallableDefinition node)
		{
		}

		public virtual void OnNamespaceDeclaration(Milo.Ast.NamespaceDeclaration node)
		{
		}

		public virtual void OnImport(Milo.Ast.Import node)
		{				
			if (EnterImport(node))
			{
				Visit(node.AssemblyReference);
				Visit(node.Alias);
				LeaveImport(node);
			}
		}
			
		public virtual bool EnterImport(Milo.Ast.Import node)
		{
			return true;
		}
		
		public virtual void LeaveImport(Milo.Ast.Import node)
		{
		}

		public virtual void OnModule(Milo.Ast.Module node)
		{				
			if (EnterModule(node))
			{
				Visit(node.Attributes);
				Visit(node.Members);
				Visit(node.BaseTypes);
				Visit(node.Namespace);
				Visit(node.Imports);
				Visit(node.Globals);
				Visit(node.AssemblyAttributes);
				LeaveModule(node);
			}
		}
			
		public virtual bool EnterModule(Milo.Ast.Module node)
		{
			return true;
		}
		
		public virtual void LeaveModule(Milo.Ast.Module node)
		{
		}

		public virtual void OnClassDefinition(Milo.Ast.ClassDefinition node)
		{				
			if (EnterClassDefinition(node))
			{
				Visit(node.Attributes);
				Visit(node.Members);
				Visit(node.BaseTypes);
				LeaveClassDefinition(node);
			}
		}
			
		public virtual bool EnterClassDefinition(Milo.Ast.ClassDefinition node)
		{
			return true;
		}
		
		public virtual void LeaveClassDefinition(Milo.Ast.ClassDefinition node)
		{
		}

		public virtual void OnStructDefinition(Milo.Ast.StructDefinition node)
		{				
			if (EnterStructDefinition(node))
			{
				Visit(node.Attributes);
				Visit(node.Members);
				Visit(node.BaseTypes);
				LeaveStructDefinition(node);
			}
		}
			
		public virtual bool EnterStructDefinition(Milo.Ast.StructDefinition node)
		{
			return true;
		}
		
		public virtual void LeaveStructDefinition(Milo.Ast.StructDefinition node)
		{
		}

		public virtual void OnInterfaceDefinition(Milo.Ast.InterfaceDefinition node)
		{				
			if (EnterInterfaceDefinition(node))
			{
				Visit(node.Attributes);
				Visit(node.Members);
				Visit(node.BaseTypes);
				LeaveInterfaceDefinition(node);
			}
		}
			
		public virtual bool EnterInterfaceDefinition(Milo.Ast.InterfaceDefinition node)
		{
			return true;
		}
		
		public virtual void LeaveInterfaceDefinition(Milo.Ast.InterfaceDefinition node)
		{
		}

		public virtual void OnEnumDefinition(Milo.Ast.EnumDefinition node)
		{				
			if (EnterEnumDefinition(node))
			{
				Visit(node.Attributes);
				Visit(node.Members);
				Visit(node.BaseTypes);
				LeaveEnumDefinition(node);
			}
		}
			
		public virtual bool EnterEnumDefinition(Milo.Ast.EnumDefinition node)
		{
			return true;
		}
		
		public virtual void LeaveEnumDefinition(Milo.Ast.EnumDefinition node)
		{
		}

		public virtual void OnEnumMember(Milo.Ast.EnumMember node)
		{				
			if (EnterEnumMember(node))
			{
				Visit(node.Attributes);
				Visit(node.Initializer);
				LeaveEnumMember(node);
			}
		}
			
		public virtual bool EnterEnumMember(Milo.Ast.EnumMember node)
		{
			return true;
		}
		
		public virtual void LeaveEnumMember(Milo.Ast.EnumMember node)
		{
		}

		public virtual void OnField(Milo.Ast.Field node)
		{				
			if (EnterField(node))
			{
				Visit(node.Attributes);
				Visit(node.Type);
				Visit(node.Initializer);
				LeaveField(node);
			}
		}
			
		public virtual bool EnterField(Milo.Ast.Field node)
		{
			return true;
		}
		
		public virtual void LeaveField(Milo.Ast.Field node)
		{
		}

		public virtual void OnProperty(Milo.Ast.Property node)
		{				
			if (EnterProperty(node))
			{
				Visit(node.Attributes);
				Visit(node.Parameters);
				Visit(node.Getter);
				Visit(node.Setter);
				Visit(node.Type);
				Visit(node.ExplicitInfo);
				LeaveProperty(node);
			}
		}
			
		public virtual bool EnterProperty(Milo.Ast.Property node)
		{
			return true;
		}
		
		public virtual void LeaveProperty(Milo.Ast.Property node)
		{
		}

		public virtual void OnEvent(Milo.Ast.Event node)
		{				
			if (EnterEvent(node))
			{
				Visit(node.Attributes);
				Visit(node.Add);
				Visit(node.Remove);
				Visit(node.Raise);
				Visit(node.Type);
				LeaveEvent(node);
			}
		}
			
		public virtual bool EnterEvent(Milo.Ast.Event node)
		{
			return true;
		}
		
		public virtual void LeaveEvent(Milo.Ast.Event node)
		{
		}

		public virtual void OnLocal(Milo.Ast.Local node)
		{
		}

		public virtual void OnBlockExpression(Milo.Ast.BlockExpression node)
		{				
			if (EnterBlockExpression(node))
			{
				Visit(node.Parameters);
				Visit(node.ReturnType);
				Visit(node.Body);
				LeaveBlockExpression(node);
			}
		}
			
		public virtual bool EnterBlockExpression(Milo.Ast.BlockExpression node)
		{
			return true;
		}
		
		public virtual void LeaveBlockExpression(Milo.Ast.BlockExpression node)
		{
		}

		public virtual void OnMethod(Milo.Ast.Method node)
		{				
			if (EnterMethod(node))
			{
				Visit(node.Attributes);
				Visit(node.Parameters);
				Visit(node.GenericParameters);
				Visit(node.ReturnType);
				Visit(node.ReturnTypeAttributes);
				Visit(node.Body);
				Visit(node.Locals);
				Visit(node.ExplicitInfo);
				LeaveMethod(node);
			}
		}
			
		public virtual bool EnterMethod(Milo.Ast.Method node)
		{
			return true;
		}
		
		public virtual void LeaveMethod(Milo.Ast.Method node)
		{
		}

		public virtual void OnConstructor(Milo.Ast.Constructor node)
		{				
			if (EnterConstructor(node))
			{
				Visit(node.Attributes);
				Visit(node.Parameters);
				Visit(node.GenericParameters);
				Visit(node.ReturnType);
				Visit(node.ReturnTypeAttributes);
				Visit(node.Body);
				Visit(node.Locals);
				Visit(node.ExplicitInfo);
				LeaveConstructor(node);
			}
		}
			
		public virtual bool EnterConstructor(Milo.Ast.Constructor node)
		{
			return true;
		}
		
		public virtual void LeaveConstructor(Milo.Ast.Constructor node)
		{
		}

		public virtual void OnDestructor(Milo.Ast.Destructor node)
		{				
			if (EnterDestructor(node))
			{
				Visit(node.Attributes);
				Visit(node.Parameters);
				Visit(node.GenericParameters);
				Visit(node.ReturnType);
				Visit(node.ReturnTypeAttributes);
				Visit(node.Body);
				Visit(node.Locals);
				Visit(node.ExplicitInfo);
				LeaveDestructor(node);
			}
		}
			
		public virtual bool EnterDestructor(Milo.Ast.Destructor node)
		{
			return true;
		}
		
		public virtual void LeaveDestructor(Milo.Ast.Destructor node)
		{
		}

		public virtual void OnParameterDeclaration(Milo.Ast.ParameterDeclaration node)
		{				
			if (EnterParameterDeclaration(node))
			{
				Visit(node.Type);
				Visit(node.Attributes);
				LeaveParameterDeclaration(node);
			}
		}
			
		public virtual bool EnterParameterDeclaration(Milo.Ast.ParameterDeclaration node)
		{
			return true;
		}
		
		public virtual void LeaveParameterDeclaration(Milo.Ast.ParameterDeclaration node)
		{
		}

		public virtual void OnGenericParameterDeclaration(Milo.Ast.GenericParameterDeclaration node)
		{
		}

		public virtual void OnDeclaration(Milo.Ast.Declaration node)
		{				
			if (EnterDeclaration(node))
			{
				Visit(node.Type);
				LeaveDeclaration(node);
			}
		}
			
		public virtual bool EnterDeclaration(Milo.Ast.Declaration node)
		{
			return true;
		}
		
		public virtual void LeaveDeclaration(Milo.Ast.Declaration node)
		{
		}

		public virtual void OnAttribute(Milo.Ast.Attribute node)
		{				
			if (EnterAttribute(node))
			{
				Visit(node.Arguments);
				Visit(node.NamedArguments);
				LeaveAttribute(node);
			}
		}
			
		public virtual bool EnterAttribute(Milo.Ast.Attribute node)
		{
			return true;
		}
		
		public virtual void LeaveAttribute(Milo.Ast.Attribute node)
		{
		}

		public virtual void OnStatementModifier(Milo.Ast.StatementModifier node)
		{				
			if (EnterStatementModifier(node))
			{
				Visit(node.Condition);
				LeaveStatementModifier(node);
			}
		}
			
		public virtual bool EnterStatementModifier(Milo.Ast.StatementModifier node)
		{
			return true;
		}
		
		public virtual void LeaveStatementModifier(Milo.Ast.StatementModifier node)
		{
		}

		public virtual void OnGotoStatement(Milo.Ast.GotoStatement node)
		{				
			if (EnterGotoStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Label);
				LeaveGotoStatement(node);
			}
		}
			
		public virtual bool EnterGotoStatement(Milo.Ast.GotoStatement node)
		{
			return true;
		}
		
		public virtual void LeaveGotoStatement(Milo.Ast.GotoStatement node)
		{
		}

		public virtual void OnLabelStatement(Milo.Ast.LabelStatement node)
		{				
			if (EnterLabelStatement(node))
			{
				Visit(node.Modifier);
				LeaveLabelStatement(node);
			}
		}
			
		public virtual bool EnterLabelStatement(Milo.Ast.LabelStatement node)
		{
			return true;
		}
		
		public virtual void LeaveLabelStatement(Milo.Ast.LabelStatement node)
		{
		}

		public virtual void OnBlock(Milo.Ast.Block node)
		{				
			if (EnterBlock(node))
			{
				Visit(node.Modifier);
				Visit(node.Statements);
				LeaveBlock(node);
			}
		}
			
		public virtual bool EnterBlock(Milo.Ast.Block node)
		{
			return true;
		}
		
		public virtual void LeaveBlock(Milo.Ast.Block node)
		{
		}

		public virtual void OnDeclarationStatement(Milo.Ast.DeclarationStatement node)
		{				
			if (EnterDeclarationStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Declaration);
				Visit(node.Initializer);
				LeaveDeclarationStatement(node);
			}
		}
			
		public virtual bool EnterDeclarationStatement(Milo.Ast.DeclarationStatement node)
		{
			return true;
		}
		
		public virtual void LeaveDeclarationStatement(Milo.Ast.DeclarationStatement node)
		{
		}

		public virtual void OnMacroStatement(Milo.Ast.MacroStatement node)
		{				
			if (EnterMacroStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Arguments);
				Visit(node.Block);
				LeaveMacroStatement(node);
			}
		}
			
		public virtual bool EnterMacroStatement(Milo.Ast.MacroStatement node)
		{
			return true;
		}
		
		public virtual void LeaveMacroStatement(Milo.Ast.MacroStatement node)
		{
		}

		public virtual void OnTryStatement(Milo.Ast.TryStatement node)
		{				
			if (EnterTryStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.ProtectedBlock);
				Visit(node.ExceptionHandlers);
				Visit(node.EnsureBlock);
				LeaveTryStatement(node);
			}
		}
			
		public virtual bool EnterTryStatement(Milo.Ast.TryStatement node)
		{
			return true;
		}
		
		public virtual void LeaveTryStatement(Milo.Ast.TryStatement node)
		{
		}

		public virtual void OnExceptionHandler(Milo.Ast.ExceptionHandler node)
		{				
			if (EnterExceptionHandler(node))
			{
				Visit(node.Declaration);
				Visit(node.Block);
				LeaveExceptionHandler(node);
			}
		}
			
		public virtual bool EnterExceptionHandler(Milo.Ast.ExceptionHandler node)
		{
			return true;
		}
		
		public virtual void LeaveExceptionHandler(Milo.Ast.ExceptionHandler node)
		{
		}

		public virtual void OnIfStatement(Milo.Ast.IfStatement node)
		{				
			if (EnterIfStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Condition);
				Visit(node.TrueBlock);
				Visit(node.FalseBlock);
				LeaveIfStatement(node);
			}
		}
			
		public virtual bool EnterIfStatement(Milo.Ast.IfStatement node)
		{
			return true;
		}
		
		public virtual void LeaveIfStatement(Milo.Ast.IfStatement node)
		{
		}

		public virtual void OnUnlessStatement(Milo.Ast.UnlessStatement node)
		{				
			if (EnterUnlessStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Condition);
				Visit(node.Block);
				LeaveUnlessStatement(node);
			}
		}
			
		public virtual bool EnterUnlessStatement(Milo.Ast.UnlessStatement node)
		{
			return true;
		}
		
		public virtual void LeaveUnlessStatement(Milo.Ast.UnlessStatement node)
		{
		}

		public virtual void OnForStatement(Milo.Ast.ForStatement node)
		{				
			if (EnterForStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Declarations);
				Visit(node.Iterator);
				Visit(node.Block);
				LeaveForStatement(node);
			}
		}
			
		public virtual bool EnterForStatement(Milo.Ast.ForStatement node)
		{
			return true;
		}
		
		public virtual void LeaveForStatement(Milo.Ast.ForStatement node)
		{
		}

		public virtual void OnWhileStatement(Milo.Ast.WhileStatement node)
		{				
			if (EnterWhileStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Condition);
				Visit(node.Block);
				LeaveWhileStatement(node);
			}
		}
			
		public virtual bool EnterWhileStatement(Milo.Ast.WhileStatement node)
		{
			return true;
		}
		
		public virtual void LeaveWhileStatement(Milo.Ast.WhileStatement node)
		{
		}

		public virtual void OnBreakStatement(Milo.Ast.BreakStatement node)
		{				
			if (EnterBreakStatement(node))
			{
				Visit(node.Modifier);
				LeaveBreakStatement(node);
			}
		}
			
		public virtual bool EnterBreakStatement(Milo.Ast.BreakStatement node)
		{
			return true;
		}
		
		public virtual void LeaveBreakStatement(Milo.Ast.BreakStatement node)
		{
		}

		public virtual void OnContinueStatement(Milo.Ast.ContinueStatement node)
		{				
			if (EnterContinueStatement(node))
			{
				Visit(node.Modifier);
				LeaveContinueStatement(node);
			}
		}
			
		public virtual bool EnterContinueStatement(Milo.Ast.ContinueStatement node)
		{
			return true;
		}
		
		public virtual void LeaveContinueStatement(Milo.Ast.ContinueStatement node)
		{
		}

		public virtual void OnReturnStatement(Milo.Ast.ReturnStatement node)
		{				
			if (EnterReturnStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Expression);
				LeaveReturnStatement(node);
			}
		}
			
		public virtual bool EnterReturnStatement(Milo.Ast.ReturnStatement node)
		{
			return true;
		}
		
		public virtual void LeaveReturnStatement(Milo.Ast.ReturnStatement node)
		{
		}

		public virtual void OnYieldStatement(Milo.Ast.YieldStatement node)
		{				
			if (EnterYieldStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Expression);
				LeaveYieldStatement(node);
			}
		}
			
		public virtual bool EnterYieldStatement(Milo.Ast.YieldStatement node)
		{
			return true;
		}
		
		public virtual void LeaveYieldStatement(Milo.Ast.YieldStatement node)
		{
		}

		public virtual void OnRaiseStatement(Milo.Ast.RaiseStatement node)
		{				
			if (EnterRaiseStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Exception);
				LeaveRaiseStatement(node);
			}
		}
			
		public virtual bool EnterRaiseStatement(Milo.Ast.RaiseStatement node)
		{
			return true;
		}
		
		public virtual void LeaveRaiseStatement(Milo.Ast.RaiseStatement node)
		{
		}

		public virtual void OnUnpackStatement(Milo.Ast.UnpackStatement node)
		{				
			if (EnterUnpackStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Declarations);
				Visit(node.Expression);
				LeaveUnpackStatement(node);
			}
		}
			
		public virtual bool EnterUnpackStatement(Milo.Ast.UnpackStatement node)
		{
			return true;
		}
		
		public virtual void LeaveUnpackStatement(Milo.Ast.UnpackStatement node)
		{
		}

		public virtual void OnExpressionStatement(Milo.Ast.ExpressionStatement node)
		{				
			if (EnterExpressionStatement(node))
			{
				Visit(node.Modifier);
				Visit(node.Expression);
				LeaveExpressionStatement(node);
			}
		}
			
		public virtual bool EnterExpressionStatement(Milo.Ast.ExpressionStatement node)
		{
			return true;
		}
		
		public virtual void LeaveExpressionStatement(Milo.Ast.ExpressionStatement node)
		{
		}

		public virtual void OnOmittedExpression(Milo.Ast.OmittedExpression node)
		{
		}

		public virtual void OnExpressionPair(Milo.Ast.ExpressionPair node)
		{				
			if (EnterExpressionPair(node))
			{
				Visit(node.First);
				Visit(node.Second);
				LeaveExpressionPair(node);
			}
		}
			
		public virtual bool EnterExpressionPair(Milo.Ast.ExpressionPair node)
		{
			return true;
		}
		
		public virtual void LeaveExpressionPair(Milo.Ast.ExpressionPair node)
		{
		}

		public virtual void OnMethodInvocationExpression(Milo.Ast.MethodInvocationExpression node)
		{				
			if (EnterMethodInvocationExpression(node))
			{
				Visit(node.Target);
				Visit(node.Arguments);
				Visit(node.NamedArguments);
				LeaveMethodInvocationExpression(node);
			}
		}
			
		public virtual bool EnterMethodInvocationExpression(Milo.Ast.MethodInvocationExpression node)
		{
			return true;
		}
		
		public virtual void LeaveMethodInvocationExpression(Milo.Ast.MethodInvocationExpression node)
		{
		}

		public virtual void OnUnaryExpression(Milo.Ast.UnaryExpression node)
		{				
			if (EnterUnaryExpression(node))
			{
				Visit(node.Operand);
				LeaveUnaryExpression(node);
			}
		}
			
		public virtual bool EnterUnaryExpression(Milo.Ast.UnaryExpression node)
		{
			return true;
		}
		
		public virtual void LeaveUnaryExpression(Milo.Ast.UnaryExpression node)
		{
		}

		public virtual void OnBinaryExpression(Milo.Ast.BinaryExpression node)
		{				
			if (EnterBinaryExpression(node))
			{
				Visit(node.Left);
				Visit(node.Right);
				LeaveBinaryExpression(node);
			}
		}
			
		public virtual bool EnterBinaryExpression(Milo.Ast.BinaryExpression node)
		{
			return true;
		}
		
		public virtual void LeaveBinaryExpression(Milo.Ast.BinaryExpression node)
		{
		}

		public virtual void OnConditionalExpression(Milo.Ast.ConditionalExpression node)
		{				
			if (EnterConditionalExpression(node))
			{
				Visit(node.Condition);
				Visit(node.TrueValue);
				Visit(node.FalseValue);
				LeaveConditionalExpression(node);
			}
		}
			
		public virtual bool EnterConditionalExpression(Milo.Ast.ConditionalExpression node)
		{
			return true;
		}
		
		public virtual void LeaveConditionalExpression(Milo.Ast.ConditionalExpression node)
		{
		}

		public virtual void OnReferenceExpression(Milo.Ast.ReferenceExpression node)
		{
		}

		public virtual void OnMemberReferenceExpression(Milo.Ast.MemberReferenceExpression node)
		{				
			if (EnterMemberReferenceExpression(node))
			{
				Visit(node.Target);
				LeaveMemberReferenceExpression(node);
			}
		}
			
		public virtual bool EnterMemberReferenceExpression(Milo.Ast.MemberReferenceExpression node)
		{
			return true;
		}
		
		public virtual void LeaveMemberReferenceExpression(Milo.Ast.MemberReferenceExpression node)
		{
		}

		public virtual void OnGenericReferenceExpression(Milo.Ast.GenericReferenceExpression node)
		{				
			if (EnterGenericReferenceExpression(node))
			{
				Visit(node.Target);
				Visit(node.GenericArguments);
				LeaveGenericReferenceExpression(node);
			}
		}
			
		public virtual bool EnterGenericReferenceExpression(Milo.Ast.GenericReferenceExpression node)
		{
			return true;
		}
		
		public virtual void LeaveGenericReferenceExpression(Milo.Ast.GenericReferenceExpression node)
		{
		}

		public virtual void OnSpliceExpression(Milo.Ast.SpliceExpression node)
		{				
			if (EnterSpliceExpression(node))
			{
				Visit(node.Expression);
				LeaveSpliceExpression(node);
			}
		}
			
		public virtual bool EnterSpliceExpression(Milo.Ast.SpliceExpression node)
		{
			return true;
		}
		
		public virtual void LeaveSpliceExpression(Milo.Ast.SpliceExpression node)
		{
		}

		public virtual void OnCodeLiteralExpression(Milo.Ast.CodeLiteralExpression node)
		{
		}

		public virtual void OnStringLiteralExpression(Milo.Ast.StringLiteralExpression node)
		{
		}

		public virtual void OnCharLiteralExpression(Milo.Ast.CharLiteralExpression node)
		{
		}

		public virtual void OnTimeSpanLiteralExpression(Milo.Ast.TimeSpanLiteralExpression node)
		{
		}

		public virtual void OnIntegerLiteralExpression(Milo.Ast.IntegerLiteralExpression node)
		{
		}

		public virtual void OnDoubleLiteralExpression(Milo.Ast.DoubleLiteralExpression node)
		{
		}

		public virtual void OnNullLiteralExpression(Milo.Ast.NullLiteralExpression node)
		{
		}

		public virtual void OnSelfLiteralExpression(Milo.Ast.SelfLiteralExpression node)
		{
		}

		public virtual void OnSuperLiteralExpression(Milo.Ast.SuperLiteralExpression node)
		{
		}

		public virtual void OnBoolLiteralExpression(Milo.Ast.BoolLiteralExpression node)
		{
		}

		public virtual void OnRELiteralExpression(Milo.Ast.RELiteralExpression node)
		{
		}

		public virtual void OnExpressionInterpolationExpression(Milo.Ast.ExpressionInterpolationExpression node)
		{				
			if (EnterExpressionInterpolationExpression(node))
			{
				Visit(node.Expressions);
				LeaveExpressionInterpolationExpression(node);
			}
		}
			
		public virtual bool EnterExpressionInterpolationExpression(Milo.Ast.ExpressionInterpolationExpression node)
		{
			return true;
		}
		
		public virtual void LeaveExpressionInterpolationExpression(Milo.Ast.ExpressionInterpolationExpression node)
		{
		}

		public virtual void OnHashLiteralExpression(Milo.Ast.HashLiteralExpression node)
		{				
			if (EnterHashLiteralExpression(node))
			{
				Visit(node.Items);
				LeaveHashLiteralExpression(node);
			}
		}
			
		public virtual bool EnterHashLiteralExpression(Milo.Ast.HashLiteralExpression node)
		{
			return true;
		}
		
		public virtual void LeaveHashLiteralExpression(Milo.Ast.HashLiteralExpression node)
		{
		}

		public virtual void OnListLiteralExpression(Milo.Ast.ListLiteralExpression node)
		{				
			if (EnterListLiteralExpression(node))
			{
				Visit(node.Items);
				LeaveListLiteralExpression(node);
			}
		}
			
		public virtual bool EnterListLiteralExpression(Milo.Ast.ListLiteralExpression node)
		{
			return true;
		}
		
		public virtual void LeaveListLiteralExpression(Milo.Ast.ListLiteralExpression node)
		{
		}

		public virtual void OnArrayLiteralExpression(Milo.Ast.ArrayLiteralExpression node)
		{				
			if (EnterArrayLiteralExpression(node))
			{
				Visit(node.Items);
				Visit(node.Type);
				LeaveArrayLiteralExpression(node);
			}
		}
			
		public virtual bool EnterArrayLiteralExpression(Milo.Ast.ArrayLiteralExpression node)
		{
			return true;
		}
		
		public virtual void LeaveArrayLiteralExpression(Milo.Ast.ArrayLiteralExpression node)
		{
		}

		public virtual void OnGeneratorExpression(Milo.Ast.GeneratorExpression node)
		{				
			if (EnterGeneratorExpression(node))
			{
				Visit(node.Expression);
				Visit(node.Declarations);
				Visit(node.Iterator);
				Visit(node.Filter);
				LeaveGeneratorExpression(node);
			}
		}
			
		public virtual bool EnterGeneratorExpression(Milo.Ast.GeneratorExpression node)
		{
			return true;
		}
		
		public virtual void LeaveGeneratorExpression(Milo.Ast.GeneratorExpression node)
		{
		}

		public virtual void OnExtendedGeneratorExpression(Milo.Ast.ExtendedGeneratorExpression node)
		{				
			if (EnterExtendedGeneratorExpression(node))
			{
				Visit(node.Items);
				LeaveExtendedGeneratorExpression(node);
			}
		}
			
		public virtual bool EnterExtendedGeneratorExpression(Milo.Ast.ExtendedGeneratorExpression node)
		{
			return true;
		}
		
		public virtual void LeaveExtendedGeneratorExpression(Milo.Ast.ExtendedGeneratorExpression node)
		{
		}

		public virtual void OnSlice(Milo.Ast.Slice node)
		{				
			if (EnterSlice(node))
			{
				Visit(node.Begin);
				Visit(node.End);
				Visit(node.Step);
				LeaveSlice(node);
			}
		}
			
		public virtual bool EnterSlice(Milo.Ast.Slice node)
		{
			return true;
		}
		
		public virtual void LeaveSlice(Milo.Ast.Slice node)
		{
		}

		public virtual void OnSlicingExpression(Milo.Ast.SlicingExpression node)
		{				
			if (EnterSlicingExpression(node))
			{
				Visit(node.Target);
				Visit(node.Indices);
				LeaveSlicingExpression(node);
			}
		}
			
		public virtual bool EnterSlicingExpression(Milo.Ast.SlicingExpression node)
		{
			return true;
		}
		
		public virtual void LeaveSlicingExpression(Milo.Ast.SlicingExpression node)
		{
		}

		public virtual void OnTryCastExpression(Milo.Ast.TryCastExpression node)
		{				
			if (EnterTryCastExpression(node))
			{
				Visit(node.Target);
				Visit(node.Type);
				LeaveTryCastExpression(node);
			}
		}
			
		public virtual bool EnterTryCastExpression(Milo.Ast.TryCastExpression node)
		{
			return true;
		}
		
		public virtual void LeaveTryCastExpression(Milo.Ast.TryCastExpression node)
		{
		}

		public virtual void OnCastExpression(Milo.Ast.CastExpression node)
		{				
			if (EnterCastExpression(node))
			{
				Visit(node.Target);
				Visit(node.Type);
				LeaveCastExpression(node);
			}
		}
			
		public virtual bool EnterCastExpression(Milo.Ast.CastExpression node)
		{
			return true;
		}
		
		public virtual void LeaveCastExpression(Milo.Ast.CastExpression node)
		{
		}

		public virtual void OnTypeofExpression(Milo.Ast.TypeofExpression node)
		{				
			if (EnterTypeofExpression(node))
			{
				Visit(node.Type);
				LeaveTypeofExpression(node);
			}
		}
			
		public virtual bool EnterTypeofExpression(Milo.Ast.TypeofExpression node)
		{
			return true;
		}
		
		public virtual void LeaveTypeofExpression(Milo.Ast.TypeofExpression node)
		{
		}
				
	}
}

